	<script type="text/javascript">
	function pasarVariables(pagina, nombres) {
  pagina +="?";
  nomVec = nombres.split(",");
  for (i=0; i<nomVec.length; i++)
    pagina += nomVec[i] + "=" + escape(eval(nomVec[i]))+"&";
  pagina = pagina.substring(0,pagina.length-1);
  location.href=pagina;
}
</script>
<div class="content clear-block">
	<h2>Cap&iacute;tulo 3 Tablespaces.</h2>
	<br /><p class="definicion" align="justify">
 &nbsp;&nbsp;Antes de adentrarnos en el mundo de los tablespaces, voy a introducir las diferentes unidades que utiliza Oracle para almacenar
 la informaci&oacute;n. En una base de datos vamos a encontrar segmentos, perteneciendo unicamente a un tablespace.
 Cada segmento esta construido con extensiones, cada una de estas extensiones unicamente puede pertenecer a un datafile,
 por lo que se deduce que un segmento puede albergar varios segmentos.
<br /><br />
&nbsp;&nbsp;Por otro lado cada extension se compone de uno o mas bloques, construidos con un numero fijo de bytes. 
El tama&ntilde;o elegido del bloque puede cambiar de un tablespace a otro, teniendo que elegir dicho tama&ntilde;o al crear el tablespace. 
El tama&ntilde;o tipico de estos bloques oscila entre los 8 KB y los 32KB.
<br /><br />
&nbsp;&nbsp;Una vez introducidas las diferentes unidades de almacenamiento que maneja Oracle.
Veamos que es un Tablespace, consideraremos un tablespace como el puente entre estructuras fisicas como datafiles o extensiones y
 estructuras logicas como tablas e indices.
<br /><br />
&nbsp;&nbsp;Al instalar una base de datos se crean de forma automatica dos tablespaces. SYSTEM,
se utiliza para almacenar los objetos del diccionario de oracle, y siempre se ha desaconsejado crear objetos de usuario en este tablespace.
SYSAUX este tablespece es utilizado internamente por Oracle.
<br /></p>
<p class="definicion" align="justify">
<b>TIPOS DE TABLESPACE</b>
<br /><br />
&nbsp;&nbsp;A la hora de crear un tablespace, nos tenemos que tener claro que tipos de datos va a almacenar ese tablespace. 
Atendiendo a eso, tendremos que elegir entre las siguientes opciones:</p>
 <blockquote>
-	Ser&aacute; bigfile o smallfile.<br />
-	Las extensiones se gestionaran de forma local o con el diccionario.<br />
-	Los segmentos se gestionaran manual o automaticamente.<br />
 </blockquote>
<p class="definicion" align="justify">
Creando tablespaces del tipo bigfile o smallfile:
<br /><br />
&nbsp;&nbsp;Los tablespace de tipo bigfile ser&aacute;n aquellos que unicamente posean un datafile, con un tama&ntilde;o maximo de 32TB (tama&ntilde;o de bloque 8KB). Este tipo de tablespace es aconsejable para grandes base de datos con gran cantidad de procesos de lectura/escritura. Estos procesos estan actualizando constantemente la cabecera de los datafiles y si reducimos el numero de datafiles reduciremos el tiempo de lectura/escritura.
</p>
<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif">
<pre><p>
CREATE BIGFILE TABLESPACE MiTablesPace DATAFILE '/ORADATA/PROD/MiDataFile.dbf' SIZE 25G.
</p></pre></blockquote>
<p class="definicion" align="justify">
&nbsp;&nbsp;Los tablespace de tipo smallfile seran aquellos que un tablespace pueda contener varios datafiles. El tama&ntilde;o m&aacute;ximo de cada datafile sera de 32 GB (tama&ntilde;o de bloque de 8KB), pudiendo llegar un tablespace a tener hasta 1022 datafiles, con un tama&ntilde;o total de 32 TB.
</p>
<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif">
<pre><p>
CREATE TABLESPACE MiTablesPace DATAFILE '/ORADATA/PROD/MiDataFile.dbf' SIZE 25G.
</p></pre></blockquote>
<p class="definicion" align="justify">
&nbsp;&nbsp;Como habeis visto para crear un tablespace nuevo tengo que asociarle un DataFile, indicando la ruta y el nombre donde lo voy a guardar. Para evitar tener que poner siempre la ruta podemos usar OMF (Oracle Managed Files), nos permitira omitir la ruta e incluso el nombre del datafile, creandolo el de forma automatica. Para poder utilizar OMF deberemos configurar el parametro de inicializacion DB_CREATE_FILE_DEST.
</p>
<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif">
<pre><p>
ALTER SYSTEM SET db_create_file_dest= '/oradata/prod' SCOPE=BOTH;
</p></pre></blockquote>
<p class="definicion" align="justify">
Por lo que para crear el tablespace anterior unicamente tendremos que hacer: <i>CREATE TABLESPACE MiTablesPace;</i>
<br /><br />
&nbsp;&nbsp;Sino expecificamos el tama&ntilde;o, el datafile se creara con un tama&ntilde;o de 100MB y con la opcion de auto extend activada.
<br /><br />
&nbsp;&nbsp;Ahora vamos  a tener que elegir como se van a gestionar las extensiones de nuestro tablespace. Como hemos comentado existen dos formas de forma local y mediante el diccionario. En este &uacute;ltimo modo, la base de datos almacena el porcentaje libre y el utilizado en el diccionario. Mientras que la gestion de forma local se realiza mediante bitmaps, esta opcion es la elegida por defecto.
<br /><br />
&nbsp;&nbsp;Si elegimos que los segmentos de un tablespace se gestionen de forma local, esta se puede hacer a su vez de dos formas diferentes: UNIFORM o AUTOALLOCATE. En la opcion de UNIFORM las extensiones que se a&ntilde;aden o se quitan del tablespace tiene el mismo tama&ntilde;o. Mientras que la opcion de AUTOALLOCATE este tama&ntilde;o puede variar de una extension a otra.
<br /><br />
Ejemplo de un tablespace gestionado de forma local y en la opcion de UNIFORM:</p>
<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif">
<pre><p>
CREATE TABLESPACE hist2004apr
DATAFILE '/ORADATA/PROD/HIST2004APR.DBF' SIZE 25G
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 100M;
</p></pre></blockquote>
<p class="definicion" align="justify">
Nota: En el ejemplo vemos como el tama&ntilde;o de cada extension va a ser de 100 MB.
<br /><br />
Ejemplo de un tablespace gestionado de forma local y en la opcion de AUTOALLOCATE:</p>
<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif">
<pre><p>
CREATE TABLESPACE hist2004apr
DATAFILE '/ORADATA/PROD/HIST2004APR.DBF' SIZE 25G
EXTENT MANAGEMENT LOCAL AUTOALLOCATE;
</p></pre></blockquote>
<p class="definicion" align="justify">
&nbsp;&nbsp; La &uacute;ltima decisi&oacute;n que tenemos que tomar sobre nuestro tablespace es como queremos que se vayan a gestionar los segmentos. Podemos configurar Oracle para que gestione los segmentos de un tablespace tanto de forma manual como de forma autom&aacute;tica. El modo manual se ha mantenido en la versi&oacute;n 10g para guardar la compatibilidad haca atr&aacute;s, mientras que la gestion automatica aparece a partir de la version 10g de Oracle. El modo automatico realiza de una forma mas eficiente la gestion de los segmentos reduciendo la tareas de mantenimiento de los tablespace. Lo unico que debemos saber sobre el modo autatico de gesti&oacute;n de los segmentos es que es necesario que la gestion de las extensiones este en modo local.
</p>
<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif">
<pre><p>
Ejemplo tablespace en modo manual:

CREATE TABLESPACE hist2004apr
DATAFILE '/ORADATA/PROD/HIST2004APR.DBF' SIZE 25G
EXTENT MANAGEMENT LOCAL AUTOALLOCATE
SEGMENT SPACE MANAGEMENT MANUAL;

Ejemplo tablespace en modo automatico:

CREATE TABLESPACE hist2004apr
DATAFILE '/ORADATA/PROD/HIST2004APR.DBF' SIZE 25G
EXTENT MANAGEMENT LOCAL AUTOALLOCATE
SEGMENT SPACE MANAGEMENT AUTO;
</p></pre></blockquote>
<p class="definicion" align="justify">
<b>TABLESPACE TEMPORAL</b><br />
<br />
&nbsp;&nbsp;Los tablespaces temporales almacenan segmentos temporales, este tipo de segmentos se crean y se destruyen seg&uacute;n los vaya necesitando la base de datos, como por ejemplo en tareas de ordenacion. Estas tareas de ordenacion se daran por ejemplo cuando en una query utilicemos las siguientes clausulas: ORDER BY, GROUP BY.
<br />
Sintaxis:</p>
<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif">
<pre><p>
CREATE TEMPORARY TABLESPACE Mitmp TEMPFILE 'ORADATA/PROD/MiTmp.dbf' SIZE 2 G;
</p></pre></blockquote>
<p class="definicion" align="justify">
&nbsp;&nbsp; La &uacute;nica diferencia entre un DataFile y un TempFile es que en el momento de crear un tablespace un DataFile si ocupa todo el espacio que se le ha asignado, mientras que un TempFile unicamente lo reservara cuando lo necesite.
<br /><br />
<b>CREAR TABLESPACE DE UNDO</b>
<br /><br />
&nbsp;&nbsp;Este tipo de Tablespace almacenan segmentos de undo, que son los segmentos que utiliza oracle para poder recuperar datos en el caso de haber ejecutado un rollback, mantener la integridad de lectura, recuperar los datos en caso de corrupcion logica.
<br /><br />
&nbsp;&nbsp;Un tablespace de UNDO se puede crear tanto en el momento de la creacion de la base datos, como una vez ya creada la base de datos.
<br />
Sintaxis:</p>
<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif">
<pre><p>
CREATE UNDO TABLESPACE undo
DATAFILE '/ORADATA/PROD/UNDO01.DBF' SIZE 2G;
</p></pre></blockquote><br />
<p class="definicion" align="justify">
<b>BORRAR UN TABLESPACE</b>
<br />
Para borrar un tablespace utilizaremos la sentencia: </p>
<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif">
<pre><p>
DROP TABLESPACE NombreTablespace;
</p></pre></blockquote>
<p class="definicion" align="justify">
&nbsp;&nbsp;Seguramente muchos de vosotros no sepais que cuando se borra un tablespace no se eliminan de disco su correspondiente datafile, por lo que lo tendreis que borrar vosotros  a mano, o bien utilizaremos este comando:
</p>
<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif">
<pre><p>
DROP TABLESPACE hr_data INCLUDING CONTENTS AND DATAFILES;
</p></pre></blockquote><br />
<p class="definicion" align="justify">
<b>MODIFICAR TABLESPACE</b>
<br /><br />
&nbsp;&nbsp;Una vez creado nuestro tablespace nos podemos encontrar en la situaci&oacute;n que tegamos que cambiar algun parametro, como el nombre, a&ntilde;adir un datafile, cambiarlo de estado (offline, online) , etc Para poder hacer esto utilizaremos la sentencia ALTER TABLE.
<br /><br />
a)	Renombrar tablespace:</p>
<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif">
<pre><p>
ALTER TABLESPACE MiTSOld RENAME TO MiTSNew;
</p></pre></blockquote>
<p class="definicion" align="justify">
b)	A&ntilde;adir un nuevo datafile:
</p>
<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif">
<pre><p>
ALTER TABLESPACE MiTS ADD DATAFILE '/ORADATA/PROD/DATA02.DBF' SIZE 2G;
</p></pre></blockquote>
<p class="definicion" align="justify">
c)	Cambiar el estado de un tablespace. Para tareas de modifiar el path de un datafile es necesario que el tablespace este en estado offline.
</p>
<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif">
<pre><p>
1 - ALTER TABLESPACE MiTS OFFLINE.
2 - Cambiamos el datafile a su nuevo path.
3 - ALTER TABLESPACE MiTS RENAME DATAFILE 'E:/ORADATA/PROD/DATA02.dbf' TO 'H:/ORADATA/PROD/DATA02.dbf'
4 - ALTER TABLESPACE MiTS ONLINE.
</p></pre></blockquote>
<p class="definicion" align="justify">
d)	Poner un tablespace como solo lectura. En el caso que un tablespace contenga datos estaticos, es conveniente que ese tablespace se ponga como read-only para evitar que sobre el se realicen tareas de mantenimiento. Cuando un tablespace es de solo lectura sobre el no se podran hacer ni insert, update o delete.
</p>
<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif">
<pre><p>
ALTER TABLESPACE MiTS READ ONLY;

o

ALTER TABLESPACE MiTS READ WRITE;
</p></pre></blockquote><br />
<p class="definicion" align="justify">
<b>INFORMACION TABLESPACES</b>
<br /><br />
&nbsp;&nbsp;Existen algunas tablas en oracle que nos van a proporcionar informacion sobre los tablespace de nuestra base de datos. Algonas de estas tablas son:
</p>
<blockquote>
DBA_TABLESPACE<br />
DBA_DATA_FILES<br />
DBA_TEMP_FILES<br />
V$TABLESPACE<br />
</blockquote><br />
<p class="definicion" align="justify">
<b>GENERAR DLL DE UN TABLESPACE.</b>
<br /><br />
Si queremos extraer la DDL de un Tablespace determinado utilizaremos el siguiente paquete:</p>
<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif">
<pre><p>
SELECT DBMS_METADATA.GET_DDL('TABLESPACE','USERS')
FROM dual;
</p></pre></blockquote>
</div>
